package com.rem.designPattern.singleton单例;

/**
 * 单例模式
 * 懒汉式-双重检查
 * Double-Check 概念是多线程开发中常使用到的，进行了两次检查，这样就可以保证线程安全了
 * 实例化代码只用执行一次，后面再次访问时直接 return 实例化对象，也避免的反复进行方法同步
 * 结论：在实际开发中，推荐使用
 *
 * @author Rem
 * @date 2022-11-13
 */
public class Singleton06 {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(
                    () -> {
                        Singleton06 instance = Singleton06.getInstance();
                        System.out.println(instance.hashCode());
                    }
            ).start();
        }
    }

    /**
     * 构造器私有
     */
    private Singleton06() {
    }

    private static volatile Singleton06 INSTANCE;

    public static Singleton06 getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton06.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton06();
                }
            }
        }
        return INSTANCE;
    }
}